package be.ipl.pigolo.domaine;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

@SuppressWarnings("serial")
@Table(name = "FERMIER", schema = "PIGOLO")
@Entity
public class Fermier implements Serializable {

	public enum STATUS_CONNEXION {
		CONNECTE, DECONNECTE
	}

	public enum STATUS_JEU {
		/**
		 * Le fermier est en train de jouer
		 */
		ENJEU,
		/**
		 * Le fermier a perdu ou sa dernière partie est terminée et ne plus
		 * qu'observer
		 */
		OBSERVATEUR,
		/**
		 * Le fermier n'est inscrit dans aucune partie
		 */
		HORSJEU
	}

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id_fermier;

	@NotNull
	@Column(unique = true)
	private String nom;
	private String motdepasse;

	/**
	 * Cochon que le fermier a en sa possession
	 */
	private String cochon;

	@Enumerated(EnumType.STRING)
	private STATUS_CONNEXION statut_connexion;
	@Enumerated(EnumType.STRING)
	private STATUS_JEU statut_jeu;

	public Fermier(String nom, String motdepasse) {
		super();

		this.nom = nom;
		this.motdepasse = motdepasse;
		this.statut_connexion = STATUS_CONNEXION.CONNECTE;
		this.statut_jeu = STATUS_JEU.HORSJEU;
		this.cochon = "";
	}

	public Fermier(int id, String nom, String motDePasse,
			String statusConnexion, String statusJeu) {
		this(nom, motDePasse);
		this.id_fermier = id;
		if (statusConnexion
				.equalsIgnoreCase(STATUS_CONNEXION.DECONNECTE.name()))
			this.statut_connexion = STATUS_CONNEXION.DECONNECTE;
		if (statusJeu.equalsIgnoreCase(STATUS_JEU.ENJEU.name())) {
			this.statut_jeu = STATUS_JEU.ENJEU;
		} else if (statusJeu.equalsIgnoreCase(STATUS_JEU.OBSERVATEUR.name())) {
			this.statut_jeu = STATUS_JEU.OBSERVATEUR;
		}
	}

	protected Fermier() {
		super();
	}

	/**
	 * Méthode qui renvoie le nom du fermier
	 * 
	 * @return le nom du fermier
	 */
	public String getNom() {
		return nom;
	}

	/**
	 * Méthode qui renvoie le mot de passe du fermier
	 * 
	 * @return le mot de passe du fermier
	 */
	public String getMotDePasse() {
		return motdepasse;
	}

	/**
	 * Méthode qui renvoie le cochon du fermier
	 * 
	 * @return le cochon du fermier
	 */
	public Cochon getCochon() {
		if (cochon == "" || cochon.length() <= 2)
			return null;
		String tabCoco[] = this.cochon.split(",");
		Cochon coco = new Cochon(Integer.parseInt(tabCoco[0]),
				Integer.parseInt(tabCoco[1]), Integer.parseInt(tabCoco[2]),
				be.ipl.pigolo.domaine.Cochon.Couleur.valueOf(tabCoco[3]),
				be.ipl.pigolo.domaine.Cochon.Etat.valueOf(tabCoco[4]));
		return coco;
	}

	/**
	 * Méthode qui permet de modifier le cochon du fermier
	 * 
	 * @param cochon
	 *            le nouveau cochon
	 */
	public void setCochon(Cochon cochon) {
		if (cochon == null)
			this.cochon = "";
		else
			this.cochon = "" + cochon.getId() + "," + cochon.getX() + ","
					+ cochon.getY() + "," + cochon.getCouleurName() + ","
					+ cochon.getEtat().name();
	}

	/**
	 * Méthode qui renvoie le statut de connexion du fermier
	 * 
	 * @return le statut de connexion du fermier
	 */
	public STATUS_CONNEXION getStatutConnexion() {
		return statut_connexion;
	}

	/**
	 * Méthode qui renvoie le statut de jeu du fermier
	 * 
	 * @return le statut de jeu du fermier
	 */
	public STATUS_JEU getStatutJeu() {
		return statut_jeu;
	}

	/**
	 * Méthode qui permet de modifier le statut de connexion du fermier
	 * 
	 * @param connexion
	 *            le nouveau statut de connexion
	 */
	public void setStatusConnexion(STATUS_CONNEXION connexion) {
		statut_connexion = connexion;
	}

	/**
	 * Méthode qui permet de modifier le statut de jeu du fermier
	 * 
	 * @param jeu
	 *            le nouveau statut de jeu
	 */
	public void setStatusJeu(STATUS_JEU jeu) {
		statut_jeu = jeu;
	}

	/**
	 * Méthode qui renvoie l'id du fermier
	 * 
	 * @return l'id du fermier
	 */
	public int getId() {
		return id_fermier;
	}
}
